/**
 * TypeScript 类型系统基础知识
 * 
 * TypeScript 是 JavaScript 的超集，添加了静态类型检查
 * 主要优势：
 * 1. 提供编译时类型检查，减少运行时错误
 * 2. 增强代码可读性和可维护性
 * 3. 提供更好的IDE支持（自动补全、类型提示等）
 */

/**
 * 接口(Interface)定义
 * 
 * 接口用于定义对象的结构和类型约束
 * 特点：
 * - 只存在于编译阶段，不会生成JavaScript代码
 * - 可以被类实现(implements)
 * - 可以继承其他接口(extends)
 * - 可以定义可选属性、只读属性、函数类型等
 */
// 定义一个接口，用于限制对象的属性
export interface PersionInterface {
    id: string,       // 必需属性，类型为字符串
    name: string,     // 必需属性，类型为字符串
    age: number,      // 必需属性，类型为数字
    sex?: string,     // 可选属性(?)，表示该属性可以存在也可以不存在
    // 其他可能的接口成员示例（注释掉以不影响原代码）:
    // readonly createdAt: Date,  // 只读属性，初始化后不能修改
    // getFullName(): string,     // 方法签名
    // [key: string]: any,        // 索引签名，允许添加任意字符串键的属性
}

/**
 * 类型别名(Type Alias)
 * 
 * 类型别名用于为现有类型创建新名称
 * 特点：
 * - 可以为任何类型创建别名，包括基本类型、联合类型、交叉类型等
 * - 不能被类实现，也不能继承
 * - 更适合定义复杂类型组合
 */
// 自定义类型
export type PersionList = Array<PersionInterface>  // 使用泛型定义PersionInterface数组类型

/**
 * TypeScript 其他常见类型和用法（注释说明）:
 * 
 * 基本类型:
 * - string: 字符串类型
 * - number: 数字类型
 * - boolean: 布尔类型
 * - null 和 undefined: 可以作为其他类型的子类型
 * - any: 任意类型，跳过类型检查
 * - unknown: 类型安全的any，需要类型断言后使用
 * - void: 通常用作函数没有返回值
 * - never: 永不返回的函数(如抛出异常或无限循环)
 * 
 * 复合类型:
 * - 数组: number[] 或 Array<number>
 * - 元组: [string, number] (固定长度、固定类型的数组)
 * - 枚举: enum Color {Red, Green, Blue}
 * - 联合类型: string | number (可以是多种类型之一)
 * - 交叉类型: Type1 & Type2 (同时满足多个类型)
 * 
 * 高级类型:
 * - 条件类型: T extends U ? X : Y
 * - 映射类型: { [K in keyof T]: T[K] }
 * - 索引类型: keyof T, T[K]
 * - 类型保护: typeof, instanceof, in, 自定义类型谓词
 * 
 * 泛型:
 * - 函数泛型: function identity<T>(arg: T): T
 * - 类泛型: class Container<T>
 * - 接口泛型: interface Response<T>
 * - 类型别名泛型: type Pair<T> = [T, T]
 * - 泛型约束: <T extends { length: number }>
 * 
 * 实用工具类型:
 * - Partial<T>: 将T的所有属性变为可选
 * - Required<T>: 将T的所有属性变为必需
 * - Readonly<T>: 将T的所有属性变为只读
 * - Pick<T, K>: 从T中选择部分属性K
 * - Omit<T, K>: 从T中排除部分属性K
 * - Record<K, T>: 创建键类型为K，值类型为T的对象类型
 * - Exclude<T, U>: 从T中排除可以赋值给U的类型
 * - Extract<T, U>: 提取T中可以赋值给U的类型
 * - NonNullable<T>: 从T中排除null和undefined
 * - ReturnType<F>: 获取函数返回值类型
 * - Parameters<F>: 获取函数参数类型的元组
 */ 